// 引入必要的命名空间
using Microsoft.AspNetCore.Authorization; // 提供授权相关的功能
using Microsoft.AspNetCore.Mvc; // 提供MVC控制器和ActionResult支持
using UniversalAdmin.Application.DTOs; // 引入数据传输对象定义
using UniversalAdmin.Application.Services; // 引入服务层接口和实现

// 定义控制器的命名空间
namespace UniversalAdmin.Api.Controllers;

// 标记该类为API控制器
[ApiController]
// 定义路由模板，v1表示API版本，[controller]会自动替换为控制器名称
[Route("api/v1/[controller]")]
// 标记该控制器需要授权访问，且仅限Admin和SuperAdmin角色
[Authorize(Roles = "Admin,SuperAdmin")]
// 继承自ControllerBase，提供基础的控制器功能
public class SystemConfigController : ControllerBase
{
    // 注入系统配置服务接口
    private readonly ISystemConfigService _configService;

    // 构造函数，依赖注入ISystemConfigService
    public SystemConfigController(ISystemConfigService configService)
    {
        _configService = configService;
    }

    // HTTP GET方法，获取所有系统配置
    [HttpGet]
    public async Task<IActionResult> GetAllConfigs()
    {
        // 调用服务层获取所有配置
        var configs = await _configService.GetAllConfigsAsync();
        // 返回200 OK响应，包含配置列表
        return Ok(configs);
    }

    // HTTP GET方法，根据Key获取单个系统配置
    [HttpGet("{key}")]
    public async Task<IActionResult> GetConfigByKey(string key)
    {
        // 调用服务层根据Key获取配置
        var config = await _configService.GetConfigByKeyAsync(key);
        // 如果配置不存在，返回404 Not Found响应
        if (config == null)
            return NotFound(new { message = "配置不存在" });
        // 返回200 OK响应，包含配置信息
        return Ok(config);
    }

    // HTTP POST方法，创建新系统配置
    [HttpPost]
    public async Task<IActionResult> CreateConfig([FromBody] CreateSystemConfigDto dto)
    {
        try
        {
            // 调用服务层创建配置
            var config = await _configService.CreateConfigAsync(dto);
            // 返回201 Created响应，包含新配置的URI和配置信息
            return CreatedAtAction(nameof(GetConfigByKey), new { key = config.Key }, config);
        }
        catch (Exception ex)
        {
            // 如果发生异常，返回400 Bad Request响应，包含错误信息
            return BadRequest(new { message = ex.Message });
        }
    }

    // HTTP PUT方法，更新系统配置
    [HttpPut("{key}")]
    public async Task<IActionResult> UpdateConfig(string key, [FromBody] UpdateSystemConfigDto dto)
    {
        try
        {
            // 调用服务层更新配置
            var config = await _configService.UpdateConfigAsync(key, dto);
            // 如果配置不存在，返回404 Not Found响应
            if (config == null)
                return NotFound(new { message = "配置不存在" });
            // 返回200 OK响应，包含更新后的配置信息
            return Ok(config);
        }
        catch (Exception ex)
        {
            // 如果发生异常，返回400 Bad Request响应，包含错误信息
            return BadRequest(new { message = ex.Message });
        }
    }

    // HTTP DELETE方法，删除系统配置
    [HttpDelete("{key}")]
    public async Task<IActionResult> DeleteConfig(string key)
    {
        // 调用服务层删除配置
        var success = await _configService.DeleteConfigAsync(key);
        // 如果删除失败，返回404 Not Found响应
        if (!success)
            return NotFound(new { message = "配置不存在" });
        // 返回204 No Content响应，表示操作成功
        return NoContent();
    }

    // HTTP GET方法，获取系统配置的值
    [HttpGet("{key}/value")]
    public async Task<IActionResult> GetConfigValue(string key)
    {
        // 调用服务层获取配置值
        var value = await _configService.GetConfigValueAsync<string>(key);
        // 返回200 OK响应，包含配置键和值
        return Ok(new { key, value });
    }

    // HTTP POST方法，设置系统配置的值
    [HttpPost("{key}/value")]
    public async Task<IActionResult> SetConfigValue(string key, [FromBody] object value)
    {
        try
        {
            // 调用服务层设置配置值
            await _configService.SetConfigValueAsync(key, value);
            // 返回200 OK响应，包含成功消息
            return Ok(new { message = "配置值设置成功" });
        }
        catch (Exception ex)
        {
            // 如果发生异常，返回400 Bad Request响应，包含错误信息
            return BadRequest(new { message = ex.Message });
        }
    }
} 